package com.promis.widget.imgzoom;

import android.animation.Animator;
import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import com.promis.util.ScreenUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by jidanbo on 2018/6/7.
 */

public class FullScreenGridPreview extends RelativeLayout {

    public static final int STATE_NORMAL = 0;
    public static final int STATE_TRANSFORM_IN = 1;
    public static final int STATE_TRANSFORM_OUT = 2;

    private int mState = STATE_NORMAL;
    private final int duration = 300;

    private ThumbnailRect originalRect;
    private List<ThumbnailRect> originalRects;
    private List<Drawable> resources;
    private int currentIndex;
    private Rect screenRect;

    private ImageView animationIV;
    private LinearLayout gridViewBgView;
    private GridView gridView;
    private PageHorizatalScrollView horizontalScrollView;
    private PageControl pageControl;

    public FullScreenGridPreview(Context context, SparseArray<ThumbnailView> thumbnailViewMap, int currentIndex) {
        super(context);

        this.currentIndex = currentIndex;

        this.originalRects = new ArrayList<>();
        this.resources = new ArrayList<>();
        for (int i = 0; i < thumbnailViewMap.size(); i++) {
            ThumbnailView thumbnailView = thumbnailViewMap.get(i);
            this.originalRects.add(thumbnailView.getOriginalRect());
            this.resources.add(thumbnailView.getResource());
        }
        this.originalRect = originalRects.get(currentIndex);

        screenRect = ScreenUtils.getScreenRect(getContext());

        setBackgroundColor(Color.TRANSPARENT);
        initSubViews();
    }

    public FullScreenGridPreview(Context context, ThumbnailView thumbnailView) {
        super(context);

        this.currentIndex = 0;

        this.resources = new ArrayList<>();
        this.resources.add(thumbnailView.getResource());

        this.originalRect = thumbnailView.getOriginalRect();
        this.originalRects = new ArrayList<>();
        this.originalRects.add(originalRect);

        screenRect = ScreenUtils.getScreenRect(getContext());

        setBackgroundColor(Color.TRANSPARENT);
        initSubViews();
    }

    public FullScreenGridPreview(Context context) {
        super(context);
    }

    public FullScreenGridPreview(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FullScreenGridPreview(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**因此View添加在Window，点击手机返回按钮无法响应，
     * 重写此方法可以处理点击手机返回的逻辑处理，缩小图片到原位置
     * @param event
     * @return
     */
    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {//2-4
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            if (mState == STATE_TRANSFORM_IN) {
                startTransform(STATE_TRANSFORM_OUT);
                return true;
            }
        }
        return super.dispatchKeyEvent(event);
    }

    @Override
    public boolean dispatchKeyEventPreIme(KeyEvent event) {//1-3
        return super.dispatchKeyEventPreIme(event);
    }


    private WindowManager windowManager;
    private void initSubViews() {
        initImageListBgView();
        initAnimationIV();
        initHorizontalScrollView();
        initGridView();
        initPageControl();
    }

    private void initImageListBgView() {
        Activity activity = (Activity) getContext();
        windowManager = activity.getWindowManager();
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();

        Rect rect = ScreenUtils.getScreenRect(getContext());
        layoutParams.width = rect.width();
        layoutParams.height = rect.height();
        //FLAG_LAYOUT_IN_SCREEN
        layoutParams.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN;
        layoutParams.format = PixelFormat.RGBA_8888;//让背景透明，放大过程可以看到当前界面
        layoutParams.verticalMargin = 0;
        windowManager.addView(this,layoutParams);
    }

    private void initAnimationIV() {
        animationIV = new ImageView(getContext());
        animationIV.setScaleType(ImageView.ScaleType.FIT_CENTER);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(originalRect.getWidth(),originalRect.getHeight());
        params.leftMargin = originalRect.getLeft();
        params.topMargin = originalRect.getTop();
        addView(animationIV, params);

        animationIV.setImageDrawable(resources.get(currentIndex));
//        Glide.with(getContext()).load(imageUrls.get(currentIndex)).dontAnimate().into(new ImageViewTarget(animationIV));
//        Picasso.with(getContext()).load(imageUrls.get(currentIndex)).into(animationIV);
    }

    private void initHorizontalScrollView() {
        horizontalScrollView = new PageHorizatalScrollView(getContext());
        
        RelativeLayout.LayoutParams hsLayoutParams = new RelativeLayout.LayoutParams(screenRect.width(), screenRect.height());
        hsLayoutParams.leftMargin = 0;
        hsLayoutParams.topMargin = 0;
        addView(horizontalScrollView,hsLayoutParams);
        horizontalScrollView.mBaseScrollX = currentIndex * screenRect.width();
        horizontalScrollView.setOnScrollToIndexListen(new PageHorizatalScrollView.OnScrollToIndexListen() {
            @Override
            public void scrollToIndex(int index) {
                currentIndex = index;
                if (currentIndex >= resources.size()){
                    currentIndex = resources.size() - 1;
                } else if (currentIndex < 0) {
                    currentIndex = 0;
                }
                animationIV.setImageDrawable(resources.get(currentIndex));
//                Glide.with(getContext()).load(imageUrls.get(currentIndex)).into(new ImageViewTarget(animationIV));
//                Picasso.with(getContext()).load(imageUrls.get(currentIndex)).into(animationIV);

                originalRect = originalRects.get(currentIndex);
                pageControl.setCurrentPage(currentIndex);
            }
        });
        int numColumns = resources.size();
        gridViewBgView = new LinearLayout(getContext());
        LinearLayout.LayoutParams testParams = new LinearLayout.LayoutParams(screenRect.width() * numColumns, screenRect.height());
        horizontalScrollView.addView(gridViewBgView,testParams);
    }


    private void initGridView() {
        int numColumns = resources.size();
        gridView = new GridView(getContext());
        gridView.setNumColumns(numColumns);
        gridView.setColumnWidth(screenRect.width());
        LinearLayout.LayoutParams gridViewLayoutParams = new LinearLayout.LayoutParams(screenRect.width()*numColumns,screenRect.height());
        gridViewLayoutParams.leftMargin = 0;
        gridViewLayoutParams.topMargin = 0;
        gridViewBgView.addView(gridView,gridViewLayoutParams);
        final PageImageAdapter adapter = new PageImageAdapter(getContext());
        adapter.setResources(resources);
        gridView.setAdapter(adapter);
        adapter.setOnItemClickListener(new PageImageAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int i, View view) {
                startTransform(STATE_TRANSFORM_OUT);
            }
        });
    }

    private void initPageControl() {
        pageControl = new PageControl(getContext(),null);
        pageControl.setPageNumber(resources.size());
        pageControl.setSelectedColor(Color.WHITE);
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(screenRect.width(),40);
        layoutParams.topMargin = screenRect.height() - 100;
        addView(pageControl,layoutParams);
    }

    /**放大缩小动画
     * @param state
     */
    public void startTransform(final int state) {

        ValueAnimator valueAnimator = new ValueAnimator();
        valueAnimator.setDuration(duration);
        valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
        if (state == STATE_TRANSFORM_IN) {
            setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            mState = STATE_TRANSFORM_IN;
            gridViewBgView.setVisibility(INVISIBLE);
            pageControl.setVisibility(INVISIBLE);
//            PropertyValuesHolder scaleHolder = PropertyValuesHolder.ofFloat("scale", mTransfrom.startScale, mTransfrom.endScale);
            PropertyValuesHolder leftHolder = PropertyValuesHolder.ofFloat("left",originalRect.getLeft(), 0);
            PropertyValuesHolder topHolder = PropertyValuesHolder.ofFloat("top", originalRect.getTop(), 0);
            PropertyValuesHolder widthHolder = PropertyValuesHolder.ofFloat("width", originalRect.getWidth(), screenRect.width());
            PropertyValuesHolder heightHolder = PropertyValuesHolder.ofFloat("height", originalRect.getHeight(), screenRect.height());
            PropertyValuesHolder alphaHolder = PropertyValuesHolder.ofInt("alpha", 0, 255);
            valueAnimator.setValues(leftHolder, topHolder, widthHolder, heightHolder, alphaHolder);
        } else {
//            setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
            gridViewBgView.setVisibility(INVISIBLE);
            pageControl.setVisibility(INVISIBLE);
            animationIV.setVisibility(VISIBLE);
            setBackgroundColor(Color.TRANSPARENT);
            mState = STATE_TRANSFORM_OUT;
//            PropertyValuesHolder scaleHolder = PropertyValuesHolder.ofFloat("scale", mTransfrom.endScale, mTransfrom.startScale);
            PropertyValuesHolder leftHolder = PropertyValuesHolder.ofFloat("left", animationIV.getLeft(), originalRect.getLeft());
            PropertyValuesHolder topHolder = PropertyValuesHolder.ofFloat("top", animationIV.getTop(), originalRect.getTop());
            PropertyValuesHolder widthHolder = PropertyValuesHolder.ofFloat("width", animationIV.getWidth(), originalRect.getWidth());
            PropertyValuesHolder heightHolder = PropertyValuesHolder.ofFloat("height", animationIV.getHeight(), originalRect.getHeight());
            PropertyValuesHolder alphaHolder = PropertyValuesHolder.ofInt("alpha", 255, 0);
            valueAnimator.setValues(leftHolder, topHolder, widthHolder, heightHolder, alphaHolder);

//            Handler handler = new Handler(){
//                @Override
//                public void handleMessage(Message msg) {
//                    super.handleMessage(msg);
//                    animationIV.setScaleType(ImageView.ScaleType.CENTER_CROP);//根据九宫格中的图片的显示模式设置
//                }
//            };
//            handler.sendEmptyMessageDelayed(0,duration*9/10);
        }

        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public synchronized void onAnimationUpdate(ValueAnimator animation) {
                //                mTransfrom.scale = (Float) animation.getAnimatedValue("scale");
                Float left = (Float) animation.getAnimatedValue("left");
                Float top = (Float) animation.getAnimatedValue("top");
                Float width = (Float) animation.getAnimatedValue("width");
                Float height = (Float) animation.getAnimatedValue("height");
                Integer mBgAlpha = (Integer) animation.getAnimatedValue("alpha");

                RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width.intValue(),height.intValue());
                layoutParams.leftMargin = left.intValue();
                layoutParams.topMargin = top.intValue();
                animationIV.setLayoutParams(layoutParams);
                setAlpha(mBgAlpha);
            }
        });

        valueAnimator.addListener(new ValueAnimator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                /*
                 * 如果是进入的话，当然是希望最后停留在center_crop的区域。但是如果是out的话，就不应该是center_crop的位置了
                 * ， 而应该是最后变化的位置，因为当out的时候结束时，不回复视图是Normal，要不然会有一个突然闪动回去的bug
                 */
                // TODO 这个可以根据实际需求来修改
                if (mState == STATE_TRANSFORM_IN) {
                    horizontalScrollView.baseSmoothScrollTo(0);
                    setBackgroundColor(Color.BLACK);
                    pageControl.setVisibility(VISIBLE);
                    Handler handler = new Handler(){
                        @Override
                        public void handleMessage(Message msg) {
                            super.handleMessage(msg);
                            gridViewBgView.setVisibility(VISIBLE);
                            animationIV.setVisibility(INVISIBLE);
                        }
                    };
                    handler.sendEmptyMessageDelayed(0, duration);
                } else if (mState == STATE_TRANSFORM_OUT) {
                    gridViewBgView.removeView(gridView);
                    gridView = null;
                    horizontalScrollView.removeView(gridViewBgView);
                    gridViewBgView = null;
                    removeView(animationIV);
                    animationIV = null;
                    removeView(pageControl);
                    pageControl = null;
                    windowManager.removeView(FullScreenGridPreview.this);
                }
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }
        });
        valueAnimator.start();
    }
}
